package ltd.newson.easy;

public class EASY_1863_找出所有子集的异或总和再求和 {

    /**
     * 一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果；如果数组为 空 ，则异或总和为 0 。
     * 例如，数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。
     * 给你一个数组 nums ，请你求出 nums 中每个 子集 的 异或总和 ，计算并返回这些值相加之 和 。
     * 注意：在本题中，元素 相同 的不同子集应 多次 计数。
     * 数组 a 是数组 b 的一个 子集 的前提条件是：从 b 删除几个（也可能不删除）元素能够得到 a 。
     * 输入：nums = [1,3]
     * 输出：6
     * 解释：[1,3] 共有 4 个子集：
     * - 空子集的异或总和是 0 。
     * - [1] 的异或总和为 1 。
     * - [3] 的异或总和为 3 。
     * - [1,3] 的异或总和为 1 XOR 3 = 2 。
     * 0 + 1 + 3 + 2 = 6
     * @param args
     */

    public static void main(String[] args) {
        EASY_1863_找出所有子集的异或总和再求和 clazz = new EASY_1863_找出所有子集的异或总和再求和();
        System.out.println(clazz.subsetXORSum(new int[]{1, 3}));
    }

    public int subsetXORSum(int[] nums) {
        return dfs(nums, 0, 0);
    }

    public int dfs(int[] nums, int index, int preVal) {
        if (index == nums.length) {
            return preVal;
        } else {
            return dfs(nums, index + 1, preVal) + dfs(nums, index + 1, preVal ^ nums[index]);
        }
    }
}
